
#ifndef noeudUCTH
#define noeudUCTH

#include <gmpxx.h>
#include "../all2.h"
//#define TAILLE 19;

class Goban;

using namespace std;

class noeudUCT
{
    public:

    static mpz_class limite;



	noeudUCT(); // non utilisable...
	noeudUCT(Coup c);
    noeudUCT(Coup c, noeudUCT * p, int nbFreres); //crée le noeud, et le rajotue comme fils de son pere.
    noeudUCT(noeudUCT * p); //ATTENTION, ne rajoute pas le noeud à son pere, se contente de le cosntruire, (sinon, utiliser le cosntructeur aud essus.

    ~noeudUCT();
    void suppr();
  //  void creerToutLesFils(EPlateau * p);
  //  int creerToutLesFreres(EPlateau * p, int x, int y);


	// ACCESSEURS
	noeudUCT * getPere();
	noeudUCT * getFrereG();
	void setFrereG (noeudUCT * n);
    void setPere(noeudUCT * p);
    void setCoup(Coup c);
	noeudUCT * getPremierFils(); //retourne juste le PREMIER fils

    noeudUCT * getFils();
    noeudUCT * getFils(Coup c);
    noeudUCT * getFils(Coup c, vector<pthread_mutex_t> * tM, int * cpt);
    noeudUCT * getFrere(Coup c);
    noeudUCT * getFrere(Coup co,vector<pthread_mutex_t> * tableMutex, int * cpt);

    int getNbrFils();

	bool getFinni();

	Coup getCoup();


	double getProba();
    int getScore();
    void setScore(int cpt);
    int getNombreDePassages();
    //void setNombreDePassages(int nombreDePassage);
    int getNbrPiecesPosees();
    //void setNbrPiecesPosees(int nombreDePierresPosees);
    void passage(int i, double emBranchementTotal); //maj le noeud en fonction de son score

    void afficher(std::ostream &out);

	// METHODE

	noeudUCT * creerFils(Coup c, int nbFreres);
	double getRatio() ; 	//retourne le ratio nombre de passages tentes / nombre de victoires
    //double valeurChoix(int n); //retourne la valeur du choix de ce noeud.
  //  double valeurChoix(int n, int etage, int ran);
   double valeurChoix(int taille, int etage, int pPere );
	vector<noeudUCT *> getTousLesFils() ; 	// retourne tous les fils de ce noeud
	void addFils( noeudUCT * n) ; 	// ajodute un noeud en tant que fils
    //void victoire(); //incremente nbVictoire.
    //void passage(); //incremente NbPassage.



    private:
	//noeuds voisins
	noeudUCT * pere;
	noeudUCT * frereG; // frere gauche, pour trouver tout les fils du pere,
	noeudUCT * fils;
	//ratio
	int nbrPassages ;
	int nbrPiecesPosees;

	double proba;

	//coup joué sur ce noeud
	Coup coup ;

	//bool fini;
    short score; // =0 normalement = score de la partie si partie terminé ou si toutes les sous branche du noeud ont été explorés.
    //short nbrFils;

};

#endif
